home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / 3dvect39 / clear.asm < prev    next >
Assembly Source File  |  1994-10-30  |  14KB  |  594 lines

  1. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  2. ;
  3. ; Filename     : Clear.asm
  4. ; Included from: Main Assembley module
  5. ; Description  : Screen clearing routines and Bitmap compilation routines
  6. ;
  7. ; Written by: John McCarthy
  8. ;             1316 Redwood Lane
  9. ;             Pickering, Ontario.
  10. ;             Canada, Earth, Milky Way (for those out-of-towners)
  11. ;             L1X 1C5
  12. ;
  13. ; Internet/Usenet:  BRIAN.MCCARTHY@CANREM.COM
  14. ;         Fidonet:  Brian McCarthy 1:229/15
  15. ;   RIME/Relaynet: ->CRS
  16. ;
  17. ; Home phone, (905) 831-1944, don't call at 2 am eh!
  18. ;
  19. ; John Mccarthy would really love to work for a company programming Robots
  20. ; or doing some high intensive CPU work.  Hint. Hint.
  21. ;
  22. ; Send me your protected mode source code!
  23. ; Send me your Objects!
  24. ; But most of all, Send me a postcard!!!!
  25. ;
  26. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  27.  
  28.          .386p
  29.          jumps
  30.  
  31. code32   segment para public use32
  32.          assume cs:code32, ds:code32
  33.  
  34.          include pmode.ext                  ; protected mode externals by TRAN
  35.          include 3d.ext
  36.  
  37.          include macros.inc
  38.          include equ.inc
  39.  
  40.          public _compile_foreground
  41.          public _compile_background_dl
  42.          public _compile_xy
  43.          public _gif_squeeze_y
  44.          public _gif_squeeze_x
  45.  
  46. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  47. ; _Compile_background_dl:  Generate clear compiled bitmap, colour=dl
  48. ; In:
  49. ;  Regs:
  50. ;    DL - colour to write for "blank", usually 0
  51. ;   EBP => available memory - crashes if not enough.
  52. ;  Memory:
  53. ;   _cliptp - clipping parameters
  54. ;   _clipbt
  55. ;   _cliplt
  56. ;   _cliprt
  57. ;
  58. ; Out:
  59. ;  EBP => location for "clear" routine
  60. ;  EDI => next available location in memory (after ret function, ready for stosb)
  61. ;
  62. ; Notes:
  63. ;  The X clipping parameters must be aligned by 4 pixels. eg: 160,164,168...
  64. ;  are valid clipping borders.  This is only neccessary on the X axis.
  65. ;
  66. ;  When calling the resulting compiled routine, EDI must point to the
  67. ;  current video page.  eg mov edi,_current_page   call ebp
  68. ;
  69. ;  66 BA C5 03 B0 0F EE
  70. ;  out_8 sc_data, all_planes   ; write to all planes
  71. ;
  72. ;  66 BA C5 03 B0 xx EE
  73. ;  out_8 sc_data, xx           ; write to selective plane (1,2,4,8)
  74. ;
  75. ;  66 C7 87 DD CC BB AA 22 11
  76. ;  mov word ptr [edi+0aabbccddh],1122h
  77. ;
  78. ;  C6 87 DD CC BB AA 11
  79. ;  mov byte ptr [edi+0aabbccddh],11h
  80. ;
  81. ;  C7 87 DD CC BB AA 44 33 22 11
  82. ;  mov dword ptr [edi+0aabbccddh],11223344h
  83. ;
  84. ;  C3
  85. ;  ret
  86. ;
  87. ;  89 87 44 33 22 11
  88. ;  mov [edi+11223344h],eax
  89. ;
  90. ;  33 C0
  91. ;  xor eax,eax
  92. ;
  93. ;  D1 E9
  94. ;  shr ecx,1
  95. ;
  96. ;  B8 12 12 12 12
  97. ;  mov eax,12121212h
  98. ;
  99. ;  88 87 44 33 22 11
  100. ;  mov [edi+11223344h],al
  101. ;
  102. ;  66 89 87 44 33 22 11
  103. ;  mov [edi+11223344h],ax
  104. ;
  105. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  106.  
  107. tempqx   dd 0
  108. tempqy   dd 0
  109. j        dd 0
  110. i        dd 0
  111. trash    dd 0
  112.  
  113. _compile_background_dl:
  114.          mov trash,0
  115.          mov edi,ebp
  116.  
  117.          mov esi,offset macro0 ; set out_8 all_planes
  118.          mov ecx, 7
  119.          rep movsb
  120.  
  121.          mov esi,offset macro9 ; set mov eax,colour
  122.          mov ecx,1
  123.          rep movsb
  124.  
  125.          mov al,dl             ; set colour
  126.          mov ecx,4
  127.          rep stosb
  128.  
  129.          xor eax,eax
  130.          mov i,eax
  131.          mov ax,_ymaxs
  132.          sub ax,_ymins
  133.          mov tempqy,eax
  134. cb_bc_loop1:
  135.          xor eax,eax
  136.          mov j,eax
  137.          mov ax,_xmaxs
  138.          sub ax,_xmins
  139.          shr eax,4             ; /4/4
  140.          mov tempqx,eax
  141. cb_bc_loop2:
  142.          cmp tempqx,0
  143.          je cb_nobiglines
  144.  
  145.          xor eax,eax
  146.          mov ax,_ycent
  147.          add ax,_ymins
  148.          cmul ebx,eax,xactual
  149.          shr ebx,2
  150.          add ebx,j
  151.  
  152.          mov ax,_xcent
  153.          add ax,_xmins
  154.          shr eax,2
  155.          add ebx,eax
  156.  
  157.          mov ecx,i
  158.          cmul eax,ecx,xactual
  159.          shr eax,2
  160.          add ebx,eax
  161.  
  162.          test ebx,1
  163.          jz cb_noalign
  164.  
  165.          mov esi,offset macroa ; set mov [edi+12345678h],al
  166.          mov ecx,2
  167.          rep movsb
  168.  
  169.          mov eax,ebx
  170.          stosb
  171.          shr eax,8
  172.          stosb
  173.          shr eax,8
  174.          stosb
  175.          shr eax,8
  176.          stosb
  177.  
  178.          mov trash,1
  179.  
  180.          xor eax,eax
  181.          mov j,eax
  182.          mov ax,_xmaxs
  183.          sub ax,_xmins
  184.          sub eax,4
  185.          shr eax,4             ; /4/4
  186.          mov tempqx,eax
  187.          inc j
  188.          jmp cb_bc_loop2
  189.  
  190. cb_noalign:
  191.          mov esi,offset macro6 ; set mov [edi+12345678h],eax
  192.          mov ecx,2
  193.          rep movsb
  194.  
  195.          mov eax,ebx
  196.          stosb
  197.          shr eax,8
  198.          stosb
  199.          shr eax,8
  200.          stosb
  201.          shr eax,8
  202.          stosb
  203.  
  204.          add j,4
  205.  
  206.          dec tempqx
  207.          jnz cb_bc_loop2
  208.  
  209. cb_nobiglines:
  210.          mov cx,_xmaxs
  211.          sub cx,_xmins
  212.          sub cx,w trash
  213.          test cx,8+4
  214.          jz cb_noextra
  215.  
  216.          xor eax,eax
  217.          mov ax,_ycent
  218.          add ax,_ymins
  219.          cmul ebx,eax,xactual
  220.          shr ebx,2
  221.          add ebx,j
  222.  
  223.          mov ax,_xcent
  224.          add ax,_xmins
  225.          shr eax,2
  226.          add ebx,eax
  227.  
  228.          mov esi,i
  229.          cmul eax,esi,xactual
  230.          shr eax,2
  231.          add eax,ebx
  232.          mov ebx,eax
  233.  
  234.          test cx,8
  235.          jz cb_no8
  236.  
  237.          push cx
  238.          mov esi,offset macrob ; set mov word ptr [edi+12345678h],ax
  239.          mov ecx,3
  240.          rep movsb
  241.  
  242.          stosb
  243.          shr eax,8
  244.          stosb
  245.          shr eax,8
  246.          stosb
  247.          shr eax,8
  248.          stosb
  249.  
  250.          add ebx,2
  251.          pop cx
  252. cb_no8:
  253.          test cx,4
  254.          jz cb_noextra
  255.  
  256.          mov esi,offset macroa ; set mov [edi+12345678h],eax
  257.          mov ecx,2
  258.          rep movsb
  259.  
  260.          mov eax,ebx
  261.          stosb
  262.          shr eax,8
  263.          stosb
  264.          shr eax,8
  265.          stosb
  266.          shr eax,8
  267.          stosb
  268. cb_noextra:
  269.  
  270.          inc i
  271.          dec tempqy
  272.          jnz cb_bc_loop1
  273.  
  274.          mov al,macro5
  275.          stosb
  276.  
  277.          ret
  278.  
  279. macro0 db 066h,0BAh,0C5h,003h,0B0h,00Fh,0EEh            ; out_8 sc_data, all_planes
  280. macro1 db 066h,0BAh,0C5h,003h,0B0h,000h,0EEh            ; out_8 sc_data, xx - write to selective plane (1,2,4,8)
  281. macro2 db 066h,0C7h,087h,0DDh,0CCh,0BBh,0AAh,022h,011h  ; mov word ptr [edi+0aabbccddh],1122h
  282. macro3 db 0C6h,087h,0DDh,0CCh,0BBh,0AAh,011h            ; mov byte ptr [edi+0aabbccddh],11h
  283. macro4 db 0C7h,087h,0DDh,0CCh,0BBh,0AAh,044h,033h,022h,011h ; mov dword ptr [edi+0aabbccddh],11223344h
  284. macro5 db 0C3h                          ; ret
  285. macro6 db 089h,087h,044h,033h,022h,011h ; mov [edi+11223344h],eax
  286. macro7 db 033h,0C0h                     ; xor eax,eax
  287. macro8 db 0D1h,0E9h                     ; shr ecx,1
  288. macro9 db 0B8h,012h,012h,012h,012h      ; mov eax,12121212h
  289. macroa db 088h,087h,044h,033h,022h,011h ; mov [edi+11223344h],al
  290. macrob db 066h,089h,087h,044h,033h,022h,011h ; mov [edi+11223344h],ax
  291.  
  292. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  293. ; _Compile_foreground: Generate compiled bitmap for bitmap pointed to by EDX
  294. ; In:
  295. ;  Regs:
  296. ;   EAX => bitmap offset  (first 2 words are bitmap x,y)
  297. ;    BX - x start for bitmap
  298. ;    CX - y start for bitmap
  299. ;    DL - colour to consider for "blank", usually 0 (anything lower = blank)
  300. ;   EBP => available memory - crashes if not enough.
  301. ;  Memory:
  302. ;   _cliptp - clipping parameters
  303. ;   _clipbt
  304. ;   _cliplt
  305. ;   _cliprt
  306. ;
  307. ; Out:
  308. ;  EBP => location for routine
  309. ;  EDI => next free memory location
  310. ;
  311. ; Notes:
  312. ;  When calling the resulting compiled routine, EDI must point to the
  313. ;  current video page.  eg mov edi,_current_page   call ebp
  314. ;
  315. ; Resulting routine needs:
  316. ;
  317. ;  EDI => screen offset
  318. ;  EAX => port mask for starting plane, eg: al = 1,2,4, or 8
  319. ;
  320. ; eg:
  321. ;  mov edi,_current_page
  322. ;  mov al,1
  323. ;  call [ebp]
  324. ;
  325. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  326.  
  327. poctor   dd 0  ; top left of bitmap
  328. pik      dd 0  ; current column of bitmap (offset)
  329. xlen     dw 0  ; xlength, ylength
  330. ylen     dw 0
  331. xtemp    dw 0  ; length counters
  332. ytemp    dw 0
  333. membash  dd 0  ; pointer to start of memory
  334. xtop     dw 0  ; where is bitmap on screen
  335. ytop     dw 0
  336. yreal    dw 0
  337. xreal    dw 0
  338. blank    db 0
  339. count4   db 0
  340. ddr      dd 0
  341. ddn      dd 0
  342.  
  343. _compile_foreground:
  344.          mov xtop,bx
  345.          mov ytop,cx
  346.  
  347.          mov blank,dl
  348.  
  349.          mov poctor,eax
  350.          add poctor,4
  351.  
  352.          mov bx,[eax]
  353.          mov xlen,bx
  354.          mov bx,[eax+2]
  355.          mov ylen,bx
  356.  
  357.          mov membash,ebp
  358.          mov edi,ebp
  359.  
  360.          mov esi,offset macroc
  361.          mov ecx,offset macrod - offset macroc
  362.          rep movsb
  363.  
  364.          mov count4,4
  365.  
  366. cf_loop1:
  367.          movzx eax,ytop
  368.          imul eax,xactual
  369.          movzx ebx,xtop
  370.          add eax,ebx
  371.          shr eax,2
  372.          mov ddr,eax
  373.  
  374.          mov ax,xlen
  375.          mov xtemp,ax
  376.  
  377.          mov bx,xtop
  378.          mov xreal,bx
  379.  
  380.          mov ax,xtop
  381.          and al,3
  382.          mov [macroe+2],al
  383.  
  384.          mov esi,offset macrod
  385.          mov ecx,macrog-macrod
  386.          rep movsb
  387.  
  388.          mov eax,poctor
  389.          mov pik,eax
  390. cf_loop3:
  391.          mov ax,ylen
  392.          mov ytemp,ax
  393.  
  394.          mov ax,ytop
  395.          mov yreal,ax
  396.  
  397.          mov eax,ddr
  398.          mov ddn,eax
  399.  
  400.          mov ebp,pik
  401.  
  402. cf_loop2:
  403.          mov ax,yreal
  404.  
  405.          cmp ax,_cliptp
  406.          jb cf_no
  407.          cmp ax,_clipbt
  408.          ja cf_no
  409.  
  410.          mov ax,xreal
  411.  
  412.          cmp ax,_cliplt
  413.          jb cf_no
  414.          cmp ax,_cliprt
  415.          ja cf_no
  416.  
  417.          mov al,[ebp]
  418.          cmp al,blank
  419.          jbe cf_no
  420.  
  421.          mov esi,o macro3
  422.          mov ecx,2
  423.          rep movsb
  424.  
  425.          mov bl,al
  426.          mov eax,ddn
  427.          stosb
  428.          shr eax,8
  429.          stosb
  430.          shr eax,8
  431.          stosb
  432.          shr eax,8
  433.          stosb
  434.  
  435.          mov al,bl
  436.          stosb
  437. cf_no:
  438.          inc yreal
  439.          add ddn,xactual/4
  440.          movzx ebx,xlen
  441.          add ebp,ebx
  442.  
  443.          dec ytemp
  444.          jnz cf_loop2
  445.  
  446.          add pik,4
  447.          inc ddr
  448.          add xreal,4
  449.          sub xtemp,4
  450.          cmp xtemp,0
  451.          jg cf_loop3
  452.  
  453.          inc poctor
  454.          inc xtop
  455.          dec count4
  456.          jnz cf_loop1
  457.  
  458.          mov al,macro5
  459.          stosb
  460.  
  461.          mov ebp,membash
  462.          ret
  463.  
  464. macroc:  mov ebp,edi
  465.          mov bl,al
  466. macrod:  mov edi,ebp
  467.          mov al,bl
  468. macroe   db 0C0h,0E0h,000h           ; shl al,xx
  469.          cmp al,8
  470.          jbe s macrof
  471.          shr al,4
  472.          inc edi
  473. macrof   db 066h,0BAh,0C5h,003h,0EEh ; out_8 sc_data,al
  474. macrog:
  475.  
  476. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  477. ; Gif squeezer:  Turn a X*Y gif into a X*Y/2 gif. eg 320x400 => 320x200
  478. ; In:
  479. ;   EDX => offset of bitmap (first two words are x,y size)
  480. ; Out:
  481. ;   EDX = EDX
  482. ;   EDI => new end of bitmap
  483. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  484.  
  485. _gif_squeeze_y:
  486.          push eax esi ecx
  487.          shr word ptr [edx+2],1
  488.          mov ax,[edx+2]
  489.          movzx ebx,word ptr [edx]
  490.  
  491.          mov esi,edx
  492.          mov edi,edx
  493.          add esi,4
  494.          add edi,4
  495. gs_loop:
  496.          mov ecx,ebx
  497.          rep movsb
  498.  
  499.          add esi,ebx
  500.          dec ax
  501.          jnz gs_loop
  502.  
  503.          pop ecx esi eax
  504.          ret
  505.  
  506. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  507. ; _compile_xy:  Calculate offset and port mask in preparation for compiled
  508. ;               bitmap call
  509. ; In:
  510. ;   EBX = x relative screen location (both can be negative)
  511. ;   ECX = y relative screen location
  512. ; Out:
  513. ;   ESI = addition for base screen pointer
  514. ;    AL = start xmode port mask
  515. ;
  516. ; Notes:
  517. ;   A compiled bitmap can be moved around the screen by selecting an offset
  518. ;   and new start port mask.  This routine calculates those things for you.
  519. ;
  520. ; Example 1:
  521. ;
  522. ;  Draw bitmap at location it was compiled at:
  523. ;
  524. ;  mov edi,_current_page
  525. ;  mov al,1
  526. ;  mov ebp,where_compiled_bitmap_is_in_memory
  527. ;  call ebp
  528. ;
  529. ; Example 2:
  530. ;
  531. ;  Draw bitmap at new location:
  532. ;
  533. ;  mov ebx,x_offset
  534. ;  mov ecx,y_offset
  535. ;  call _compile_xy
  536. ;  mov edi,_current_page
  537. ;  add edi,esi
  538. ;  mov ebp,where_compiled_bitmap_is_in_memory
  539. ;  call ebp
  540. ;
  541. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  542.  
  543. _compile_xy:
  544.          cmul esi,ecx,xactual/4
  545.  
  546.          mov eax,ebx
  547.          shr eax,2
  548.          test eax,000800000h
  549.          jz short nomin
  550.          or   eax,0ff000000h
  551. nomin:
  552.          add esi,eax
  553.  
  554.          mov ecx,ebx
  555.          and cl,3
  556.          mov al,1
  557.          shl al,cl
  558.          ret
  559.  
  560. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  561. ; Gif squeezer:  Turn a X*Y gif into a X/2*Y gif. eg 320x400 => 160x400
  562. ; In:
  563. ;   EDX => offset of bitmap (first two words are x,y size)
  564. ; Out:
  565. ;   EDX = EDX
  566. ;   EDI => new end of bitmap
  567. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  568.  
  569. _gif_squeeze_x:
  570.          push eax esi ecx
  571.          shr word ptr [edx],1
  572.          mov ax,[edx+2]
  573.          movzx ebx,word ptr [edx]
  574.  
  575.          mov esi,edx
  576.          mov edi,edx
  577.          add esi,4
  578.          add edi,4
  579. gs_loop2:
  580.          mov ecx,ebx
  581. gs_loopx:
  582.          movsb
  583.          inc esi
  584.          loop gs_loopx
  585.  
  586.          dec ax
  587.          jnz gs_loop2
  588.  
  589.          pop ecx esi eax
  590.          ret
  591.  
  592.          ends
  593.          end
  594.